perm filename PRETZL.FAI[MPX,SYS] blob sn#218660 filedate 1983-02-26 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00018 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	
C00007 00003	TITLE PRETZL MICROCODE ASSEMBLER FOR THE MAPPIPRETZEL
C00009 00004	GO:	RESET
C00012 00005	PREDEF, ADDSYM, SYMLOK
C00015 00006	UUOH, AERR, AXPAND, AWARN
C00018 00007	DECOUT, SDMPLI, DMPLIN, LSTOUT, LST9, LST12, LST16, LSTSTR, LSTNUM
C00021 00008	SYMLST
C00023 00009	INSLST
C00024 00010	LIST
C00027 00011	ASSEMB, DOLINE, STRBIN
C00035 00012	DOLCOM, DOLEQU, DOLMSK
C00041 00013	EVAL
C00052 00014	GETTOK, GTCHR
C00055 00015	PSEUTB, PSEUT2, PSEUDT, ACOMNT, ALOC, AEND, ADEBUG, RDNUM, RDSNUM, SKPEOL, ASET
C00059 00016	BRCND, BRCND1, BRCND2
C00060 00017	SYMBOL TABLE FORMAT, PRSYMS, PSEUTB
C00062 00018	CONSTANTS, VARIABLES AND TABLES
C00066 ENDMK
C⊗;
COMMENT ⊗
{} indicate optional parameters

alu instruction:
	{d1}{,d2}{,d3}=alu operation/SPEC=nnn

destination class A:
	AR

destination class B:
	BR

destination class C:
	~SEL_BUS_REG
	MA_HI
	MA_LO
	VBIT
	ABIT
	MAPRAM
	~PTPNT
	MAP_ENB

Only one of d1, d2, d3 may be of class A, one of class B and one of class C.
For example, the following are legal destinations:
	MA_HI,BR=
	AR=
	BR,AR=
	VBIT=
	BR,~PTPNT,AR=

whereas the following are illegal:
	MA_HI,MA_LO=
	VBIT,AR,AR=
	BR,~PTPNT,ABIT=

If neither AR nor BR is specified and there is no destination specified from
class C, then the = may be omitted.

The ALU operation is specified by an infix operation on zero, one or two
operands.  The operands are called the A operand and the B operand.  The
B operand if present must be AR or BR.  The A operand is of the following
form:
	≡number or ≡constant-symbol
	mask-specification

A mask-specification is of the following form:
	<S-field←rotate,mask←mask-rotate,B operand>

If the ← and the following rotate are omitted, the rotate is assumed to be zero.
If the mask and mask rotate is omitted, it is assumed to be 177777←0.  If the
B operand is omitted it is assumed to be AR.

The S-field may be any of the following:
	AR
	BR
	PADR_MICRO
	MICRQ_SEL
	MS(0-3)
	MS(4-19)
	MS(20-35)
	~VBIT_NEW_BIT
	~VBIT
	PTPNT

branch instruction:
	mask-specification JUMPIF branch-condition branch-address/SPEC=nnn

A branch condition is one of the following:
	MEM_DONE
	~MEM_DONE
	MIOBC_BUSY
	RESET_COND
	MASKIS0
	~MASKIS0
	~MASK[0]
	MASK[0]
	MICRO_RPE
	TRUE
	MICRQ_RQ_SYNC


Pseudo ops

COMMENT <non-blank> ignored <same-non-blank>


LOC number
	Sets the location counter to the number.

END
	Defines the end of the assembly.

DEBUG
	Has no effect, but is useful for debugging the assemler.

SET constant-symbol=number
	Defines the value of a constant symbol.  This symbol may be used
	only after an ≡ in an ALU statement.

⊗
TITLE PRETZL MICROCODE ASSEMBLER FOR THE MAPPIPRETZEL

F←0
A←1
B←2
C←3
D←4
E←5
T←6
TT←7
L←10		;LOCATION COUNTER

P←17

SRC←←1
LST←←2
BIN←←3
INS←←4
ROM←←5

;LEFT HALF F BITS
ENDASM←←400000			;END PSEUDO OP SEEN
GOTONE←←200000			;FLAG TO GTCHR TO JUST RETURN A
ARDST ←←100000			;THE AR IS A DESTINATION
BRDST ←← 40000			;THE BR IS A DESTINATION
GOTMSK←← 20000			;HAVE ASSEMBLED A MASK FIELD

;RIGHT HALF F BITS
EVNUM ←←400000			;EVLNXT PARSED A NUMBER
EVMASK←←200000			;EVLNXT PARSED A MASK SPECIFICATION
EVAR  ←←100000			;EVLNXT PARSED AR
EVBR  ←← 40000			;EVLNXT PARSED BR
PEVAR ←← 20000			;EVLNXT PARSED AR (PERMANENT)
PEVBR ←← 10000			;EVLNXT PARSED BR (PERMANENT)
TMPBIT←←     1

;SYMBOL TYPES
DSTTYP←←1			;DESTINATION TYPE SYMBOLS
STYP←←2				;S TYPE SYMBOLS
BRTYP←←3			;BRANCH TYPE SYMBOLS
ADRTYP←←4			;BRANCH ADDRESS TYPE SYMBOLS
FIXTYP←←5			;FIXUP TYPE SYMBOLS
CONTYP←←6			;CONSTANT TYPE SYMBOLS

;USER UUOS
OPDEF ERR [001000,,0]
OPDEF XPAND [002000,,0]
OPDEF WARN [003000,,0]
MAXUUO←←3

DEFINE GETFRE (AC) <
	AOS AC,NXTFRE
	CAML AC,SYMPNT
	XPAND
	SUBI AC,1
>
GO:	RESET
	MOVE P,[-100,,PDL-1]
	HLRZ A,JOBSA↑
	MOVEM A,JOBFF↑
	CORE A,			;CORE DOWN TO INITIAL AMOUNT
	JRST 4,.
	MOVE A,[JSR UUOH]
	MOVEM A,41
	INIT SRC,0
	SIXBIT /DSK/
	SRCHDR
	JRST 4,.
	MOVE A,[SRCFIL,,B]
	BLT A,E
	LOOKUP SRC,B
	JRST NOMIC
	INBUF SRC,2
	INIT BIN,17
	SIXBIT /DSK/
	0
	JRST 4,.
	MOVE A,[BINFIL,,B]
	BLT A,E
	ENTER BIN,B
	JRST 4,.
	INIT LST,0
	SIXBIT /DSK/
	LSTHDR,,
	JRST 4,.
	MOVE A,[LSTFIL,,B]
	BLT A,E
	ENTER LST,B
	JRST 4,.
	OUTBUF LST,2
	INIT ROM,0
	SIXBIT /DSK/
	ROMHDR,,
	JRST 4,.
	MOVE A,[ROMFIL,,B]
	BLT A,E
	ENTER ROM,2
	JRST 4,.
	OUTBUF ROM,2
	INIT INS,0
	SIXBIT /DSK/
	INSHDR,,
	JRST 4,.
	MOVE A,[INSFIL,,B]
	BLT A,E
	ENTER INS,B
	JRST 4,.
	OUTBUF INS,2
	SETZM BINBUF
	MOVE A,[BINBUF,,BINBUF+1]
	BLT A,BINBUF+377
	SETZB F,L
	MOVE A,JOBFF
	MOVEM A,NXTFRE
	ADDI A,400
	MOVEM A,SYMPNT
	CORE A,
	JRST 4,.
	PUSHJ P,PREDEF		;ENTER PREDEFINED SYMBOLS INTO SYMBOL TABLE
	MOVEI A,1
	MOVEM A,PAGE
	MOVEM A,LINE
	PUSHJ P,ASSEMB
	OUTSTR [ASCIZ /
DONE
/]
	MOVE A,[-400,,BINBUF-1]
	MOVEI B,0
	OUTPUT BIN,A
	PUSHJ P,INSLST
	PUSHJ P,SYMLST
	PUSHJ P,LIST
	EXIT

NOMIC:	OUTSTR [ASCIZ /WHAT, NO MICROCODE?
/]
	EXIT
;PREDEF, ADDSYM, SYMLOK

;ENTER PREDEFINED SYMBOLS (PRSYMS) INTO THE SYMBOL TABLE
PREDEF:	MOVE A,SYMPNT
	ADDI A,LPRSYM		;1 + LAST ADDRESS NEEDED
	MOVEI B,(A)
	CORE B,
	JRST 4,.
	MOVE B,SYMPNT
	HRLI B,PRSYMS
	BLT B,-1(A)		;MOVE PREDEFINED SYMBOLS TO SYMTAB
	MOVSI B,PRSYMS
	MOVEM A,SYMNXT
	POPJ P,

;ADD SYMBOL IN TOKBUF TO SYMBOL TABLE AT THE END
;THE VALUE WITH TYPE IS IN A
;FIRST HAVE TO COPY THE SYMBOL TEXT TO FREE STORAGE FROM TOKBUF
ADDSYM:	PUSH P,D
	PUSH P,C
	PUSH P,E
	MOVE E,[440700,,TOKBUF]
	HRRZ D,NXTFRE
	MOVE B,D
	HRLI D,440700
ADDSY0:	AOS C,NXTFRE
	CAML C,SYMPNT
	XPAND
ADDSY1:	ILDB C,E
	IDPB C,D
	JUMPE C,ADDSY2
	TLNE E,760000
	JRST ADDSY1
	JRST ADDSY0

ADDSY2:	POP P,E
	POP P,C
	MOVE D,SYMNXT
	ADDI D,2
	MOVEM D,SYMNXT
	CAML D,JOBREL↑
	CORE D,
	JFCL
	MOVE D,SYMNXT
	MOVEM A,-2(D)
	HRRZM B,-1(D)		;STORE FIXUP,,SYMBOL POINTERS
	POP P,D
	POPJ P,

;LOOKUP TOKBUF IN SYMBOL TABLE.  SKIP RETURN IF FOUND, POINTER TO
;SYMBOL TABLE ENTRY IN B.  CALL WITH TYPE OF SYMBOL TO LOOK FOR IN
;WORD FOLLOWING THE CALL.  ZERO MEANS ANYTHING IS OK.
SYMLOK:	MOVE B,SYMPNT
SYMLO1:	LDB A,[POINT 9,(B),17]	;GET TYPE OF SYMBOL
	SKIPE @(P)
	CAMN A,@(P)
	CAIA
	JRST SYMLO2
	HRRZ A,1(B)		;POINTER TO SYMBOL NAME
	PUSHJ P,SYMCMP		;COMPARE AGAINST TOKBUF, SKIP IF NOT EQUAL
	JRST CPOPJ2
SYMLO2:	ADDI B,2
	CAME B,SYMNXT
	JRST SYMLO1
	JRST CPOPJ1		;NOT FOUND

;COMPARE TOKBUF AGAINST STRING POINTED TO BY A.  SKIP IF NOT EQUAL
SYMCMP:	HRLI A,440700
	MOVE C,[440700,,TOKBUF]
SYMCM1:	ILDB D,A
	ILDB E,C
	CAIE D,(E)
	JRST CPOPJ1		;THEY ARE NOT EQUAL
	JUMPE D,CPOPJ		;IF THEY ARE BOTH ZERO, WE HAVE A MATCH
	JRST SYMCM1
;UUOH, AERR, AXPAND, AWARN

UUOH:	0
	MOVEM 17,UUOACS+17
	MOVEI 17,UUOACS
	BLT 17,UUOACS+16
	MOVE 17,UUOACS+17
	LDB A,[POINT 9,40,8]
	CAILE A,MAXUUO
	JRST [	OUTSTR [ASCIZ /ILLEGAL USER UUO
/]
		JRST 4,.]
	LDB B,[POINT 4,40,12]		;AC FIELD
	HRRZ C,40			;EFFECTIVE ADDRESS
	PUSHJ P,@UUODTB-1(A)
	CAIA
	AOS UUOH
	MOVSI 17,UUOACS
	BLT 17,17
	JRST 2,@UUOH

UUODTB:	AERR
	AXPAND
	AWARN

HERALD:	OUTSTR [ASCIZ /
**********
PAGE /]
	MOVE D,PAGE
	PUSHJ P,DECOUT
	OUTSTR [ASCIZ / LINE /]
	MOVE D,LINE
	PUSHJ P,DECOUT
	OUTSTR [ASCIZ /
/]
	POPJ P,

AERR:	PUSHJ P,HERALD
	PUSH P,LINPNT
	PUSHJ P,SDMPLI			;COUNTS LINE
	JFCL
	POP P,LINPNT
	MOVEI A,12
	IDPB A,LINPNT
	MOVEI A,0
	IDPB A,LINPNT
	OUTSTR LINBUF
	MOVE A,[440700,,LINBUF]
	MOVEM A,LINPNT
AERR1:	PUSHJ P,GTCHR
	CAIE A,12
	JRST AERR1
	MOVEI A,0
	IDPB A,LINPNT
	OUTSTR LINBUF
	PUSH P,LINE
	PUSHJ P,SDMPLI
	JFCL
	POP P,LINE
	OUTSTR (C)
	POPJ P,

AWARN:	PUSHJ P,HERALD
	OUTSTR [ASCIZ /WARNING!! /]
	OUTSTR (C)
	POPJ P,

AXPAND:	HRRZ A,SYMNXT		;POINTER TO WHERE THE NEXT SYMBOL GOES
	SUB A,SYMPNT		;CURRENT SIZE OF THE SYMBOL TABLE ...
	CAIGE A,1000
	MOVEI A,1000		;...OR 1000, WHICHEVER IS GREATER
	HRRZ B,SYMNXT
	ADDI B,-1(A)
	MOVE C,B
	CORE B,
	JRST 4,.
	HRRZ B,SYMPNT
	ADDI B,(A)
	HRL B,SYMPNT
	BLT B,(C)		;MOVE THE SYMBOL TABLE
	ADDM A,SYMPNT
	ADDM A,SYMNXT
	POPJ P,

CPOPJ2:	AOS (P)
CPOPJ1:	AOS (P)
CPOPJ:	POPJ P,
;DECOUT, SDMPLI, DMPLIN, LSTOUT, LST9, LST12, LST16, LSTSTR, LSTNUM

;PRINT D AS DECIMAL
DECOUT:	PUSH P,E
	PUSHJ P,DECOU1
	POP P,E
	POPJ P,

DECOU1:	IDIVI D,12
	JUMPE D,DECOU2
	HRLM E,(P)
	PUSHJ P,DECOU1
	HLRZ E,(P)
DECOU2:	ADDI E,"0"
	OUTCHR E
	POPJ P,

;DUMP OUT LINBUF INTO LISTING FILE.  SDMPLI IS CALLED IF NO BINARY THIS LINE
SDMPLI:	AOS (P)
	TROA F,TMPBIT
DMPLIN:	TRZ F,TMPBIT
	PUSH P,A
	PUSH P,B
	AOS LINE
	PUSH P,D
	MOVEI D,(L)		;GET LOCATION COUNTER
	TRNN F,TMPBIT
	PUSHJ P,LST9		;PRINT LOCATION COUNTER
	POP P,D
	MOVEI A,11
	PUSHJ P,LSTOUT
	MOVE B,[440700,,LINBUF]
DMPLI1:	ILDB A,B
	JUMPE A,DMPLI2
	PUSHJ P,LSTOUT
	CAME B,LINPNT
	JRST DMPLI1
DMPLI2:	POP P,B
	MOVE A,[440700,,LINBUF]
	MOVEM A,LINPNT
	POP P,A
	POPJ P,

LSTOUT:	SOSG LSTHDR+2
	OUT LST,
	JRST .+2
	JRST 4,.
	IDPB A,LSTHDR+1
	POPJ P,

LST9:	LSH D,=27
	MOVEI E,3
	JRST LSTN

LST12:	LSH D,=24
	MOVEI E,4
	JRST LSTN

LST16:	LSH D,=20
	LSH D,-2
	MOVEI E,6
LSTN:	MOVEI C,0
	LSHC C,3
	MOVEI A,"0"(C)
	PUSHJ P,LSTOUT
	SOJG E,LSTN
	POPJ P,

LSTSTR:	HRLI C,440700
LSTST1:	ILDB A,C
	JUMPE A,CPOPJ
	PUSHJ P,LSTOUT
	JRST LSTST1

LSTNUM:	IDIVI D,10
	JUMPE D,LSTNU1
	HRLM E,(P)
	PUSHJ P,LSTNUM
	HLRZ E,(P)
LSTNU1:	MOVEI A,"0"(E)
	JRST LSTOUT
;SYMLST

SYMLST:	SETZM UNSYMS
	MOVEI A,14
	PUSHJ P,LSTOUT
	MOVEI C,[ASCIZ /SYMBOL TABLE

/]
	PUSHJ P,LSTSTR
	MOVE B,SYMPNT
SYMLS1:	LDB A,[POINT 9,(B),17]	;GET TYPE
	CAIN A,FIXTYP
	JRST SYMLS2
	CAIE A,CONTYP
	CAIN A,ADRTYP
	JRST SYMLS4
SYMLS3:	ADDI B,2
	CAME B,SYMNXT
	JRST SYMLS1
	POPJ P,

SYMLS2:	SKIPN UNSYMS
	OUTSTR [ASCIZ /UNDEFINED SYMBOLS:
/]
	SETOM UNSYMS
	HRRZ C,1(B)
	OUTSTR (C)
	OUTSTR [BYTE (7) 15,12]
	JRST SYMLS3

SYMLS4:	HRRZ C,1(B)		;POINTER TO SYMBOL
	PUSHJ P,LSTSTR
	MOVEI A,11
	PUSHJ P,LSTOUT
	HRRZ D,(B)		;VALUE OF SYMBOL
	PUSHJ P,LST16
	MOVEI C,[BYTE (7) 15,12]
	PUSHJ P,LSTSTR
	JRST SYMLS3
;INSLST

INSLST:	MOVSI A,-40
	TRZ F,TMPBIT
	PUSHJ P,INSLS1
	HRLI A,-340
	TRO F,TMPBIT
INSLS1:	MOVEI C,"¬"
	TRNE F,TMPBIT
	PUSHJ P,INSOUT		;OUTPUT LEADING ¬ IF DOING RAM LOCATIONS
	MOVE D,BINBUF(A)
	MOVEI B,=12
INSLS2:	MOVEI C,0
	LSHC C,3
	ADDI C,"0"
	PUSHJ P,INSOUT
	SOJG B,INSLS2
	MOVEI C,15
	PUSHJ P,INSOUT
	MOVEI C,12
	PUSHJ P,INSOUT
	AOBJN A,INSLS1
	POPJ P,

INSOUT:	TRNE F,TMPBIT
	JRST INSOU1
	SOSG ROMHDR+2
	OUT ROM,
	CAIA
	JRST 4,.
	IDPB C,ROMHDR+1
	POPJ P,

INSOU1:	SOSG INSHDR+2
	OUT INS,
	CAIA
	JRST 4,.
	IDPB C,INSHDR+1
	POPJ P,
;LIST

LIST:	MOVEI A,14
	PUSHJ P,LSTOUT
	MOVN B,L
	HRLZ B,B
LIST1:	MOVE C,BINBUF(B)
	MOVEM C,BINWRD
	MOVEI C,[ASCIZ /ROM  LOC=/]
	HRRZ D,B
	CAIL D,40
	MOVEI C,[ASCIZ /RAM  LOC=/]
	PUSHJ P,LSTSTR
	PUSHJ P,LST9		;TYPE OUT ADDRESS AS THREE OCTAL DIGITS
	MOVEI C,[ASCIZ /   OP=/]
	PUSHJ P,LSTSTR
	LDB A,OPPNT
	ADDI A,"0"
	PUSHJ P,LSTOUT
	MOVEI C,[ASCIZ /  BSEL=/]
	PUSHJ P,LSTSTR
	LDB D,BSLPNT
	PUSHJ P,LSTNUM
	LDB A,OPPNT
	CAIN A,2
	JRST LSTOP2
	PUSHJ P,LSTF1
	LDB A,OPPNT
	SOJE A,LSTOP1
LIST2:	PUSHJ P,LSTF2
LIST3:	MOVEI C,[BYTE (7) 15,12]
	PUSHJ P,LSTSTR
	AOBJN B,LIST1
	POPJ P,


LSTOP2:	MOVEI C,[ASCIZ /  CONST=/]
	PUSHJ P,LSTSTR
	LDB D,CONPNT		;OP2, PRINT FIELD 1 AS A CONSTANT
	PUSHJ P,LST16
	JRST LIST2

LSTOP1:	MOVEI C,[ASCIZ /  BRCOND=/]
	PUSHJ P,LSTSTR
	LDB D,BRCPNT
	PUSHJ P,LSTNUM
	MOVEI C,[ASCIZ /  BRADDR=/]
	PUSHJ P,LSTSTR
	LDB D,BRAPNT
	PUSHJ P,LSTNUM
	JRST LIST3


LSTF1:	MOVEI C,[ASCIZ /  SPEC=/]
	PUSHJ P,LSTSTR
	LDB D,SPCPNT
	PUSHJ P,LSTNUM
	MOVEI C,[ASCIZ /  S=/]
	PUSHJ P,LSTSTR
	LDB D,SPNT
	PUSHJ P,LSTNUM
	MOVEI C,[ASCIZ /  SROT=/]
	PUSHJ P,LSTSTR
	LDB D,ROTPNT
	PUSHJ P,LSTNUM
	MOVEI C,[ASCIZ /  MSIZE=/]
	PUSHJ P,LSTSTR
	LDB D,MSKPNT
	PUSHJ P,LSTNUM
	MOVEI C,[ASCIZ /  MROT=/]
	PUSHJ P,LSTSTR
	LDB D,MRTPNT
	JRST LSTNUM

LSTF2:	MOVEI C,[ASCIZ /  M -S CN=/]
	PUSHJ P,LSTSTR
	LDB D,MPNT
	PUSHJ P,LSTNUM
	MOVEI A,40
	PUSHJ P,LSTOUT
	LDB D,S3PNT
	PUSHJ P,LSTNUM
	LDB D,S2PNT
	PUSHJ P,LSTNUM
	LDB D,S1PNT
	PUSHJ P,LSTNUM
	LDB D,S0PNT
	PUSHJ P,LSTNUM
	MOVEI A,40
	PUSHJ P,LSTOUT
	LDB D,CNPNT
	PUSHJ P,LSTNUM
	MOVEI C,[ASCIZ /  DEST=/]
	PUSHJ P,LSTSTR
	LDB D,DSTPNT
	PUSHJ P,LSTNUM
	MOVEI C,[ASCIZ /  ARLD=/]
	PUSHJ P,LSTSTR
	LDB D,ARDSTP
	PUSHJ P,LSTNUM
	MOVEI C,[ASCIZ /  BRLD=/]
	PUSHJ P,LSTSTR
	LDB D,BRDSTP
	JRST LSTNUM
;ASSEMB, DOLINE, STRBIN

ASSEMB:	PUSHJ P,DOLINE		;ASSEMBLE A LINE OF CODE
	PUSHJ P,STRBIN		;DOLINE SKIPS IF NOTHING TO STORE
	TLNN F,ENDASM		;SKIP IF IT WAS AN END STATEMENT
	JRST ASSEMB
	POPJ P,

DOLINE:	MOVE A,[440700,,LINBUF]
	MOVEM A,LINPNT
	TLZ F,ARDST!BRDST
	SETZM SAVDST
	SETZM BINWRD
DOLINL:	PUSHJ P,GETTOK		;GET NEXT TOKEN IN B, SEPARATOR IN A
	JRST DOLINE		;UNREC SPEC CHAR
	JUMPGE B,DOLIN1		;JUMP IF IT IS NOT A SYMBOL
	MOVSI C,-NPSEUD
	MOVE T,(B)
DOLIN2:	CAMN T,PSEUTB(C)
	JRST DOLINP
DOLIN3:	AOBJN C,DOLIN2
	CAIE A,":"		;SKIP IF WE ARE DEFINING A SYMBOL
	JRST DOLIN4		;SYMBOL FOLLOWED BY NOT :  SEE IF IT'S JUMPIF <SP>
	PUSHJ P,SYMLOK		;SEE IF THE SYMBOL IS ALREADY DEFINED
	 0
	JRST DOLMSY		;NOT FOUND.  MAKE A NEW SYMBOL
	MOVE C,(B)		;FOUND IT.  GET THE VALUE
	LDB A,[POINT 9,C,17]	;GET SYMBOL TYPE
	CAIN A,ADRTYP		;IS IT ALREADY DEFINED?
	JRST DOLRDF		;YES, GIVE WARNING AND REDEFINE
	CAIE A,FIXTYP		;HAS SYMBOL BEEN USED IN FORWARD REFERENCE ALREADY?
	JRST 4,.		;NO?  I DON'T KNOW WHAT IT IS, THEN!!!
	PUSH P,B		;SAVE POINTER TO SYMBOL
	MOVE B,1(B)		;POINTER TO FIXUP,, WORD
	JRA B,.+1		;GET NEXT FIXUP WORD (→ TO NEXT,,INDEX INTO BINBUF)
DOFIXS:	LDB A,FIXPNT		;GET VALUE THERE ALREADY
	ADD A,L			;ADD IN VALUE OF SYMBOL (I.E. .)
	DPB A,FIXPNT		;AND STORE IT BACK
	TLNE B,-1
	JRA B,DOFIXS
	POP P,B			;GET BACK POINTER TO SYMBOL
DOFIX1:	MOVSI A,ADRTYP
	HRRI A,(L)
	MOVEM A,(B)		;CLOBBER TYPE FROM FIXTYP TO ADRTYP AND STORE VALUE
	JRST DOLINL

DOLMSY:	MOVSI A,ADRTYP
	HRRI A,(L)
	PUSHJ P,ADDSYM
	JRST DOLINL

DOLRDF:	WARN [ASCIZ /SYMBOL BEING REDEFINED
/]
	JRST DOFIX1

DOLINP:	TRNN T,377
	TDZA TT,TT		;FILE CONTAINS LESS THAN 5 CHARACTERS
	MOVE TT,1(B)		;GET SECOND WORD
	CAME TT,PSEUT2(C)
	JRST DOLIN3
	JRST @PSEUDT(C)		;EXECUTE THIS PSEUDO OPERATION

DOLIN4:	CAIE A,11
	CAIN A,40		;GOT SYMBOL FOLLOWED BY NOT :  SEE IF IT IS <SP>
	JRST DOLJMT
	CAIN A,","
	JRST DOLCOM		;SYMBOL FOLLOWED BY ,
	CAIN A,"="
	JRST DOLEQU		;SYMBOL FOLLOWED BY =
DOLJME:	ERR [ASCIZ /UNRECOGNIZED FORMAT
/]
	JRST CPOPJ1

DOLJMT:	MOVE T,(B)		;GOT SYMBOL <SP>  SEE IF SYMBOL IS JUMPIF
	CAME T,[ASCII /JUMPI/]
	JRST DOLJME
	MOVE TT,1(B)
	CAME TT,[ASCII /F/]
	JRST DOLJME
	MOVEI A,1		;HAVE JUMPIF <SP>
	DPB A,OPPNT		;STORE JUMP AS OPCODE
	PUSHJ P,GETTOK		;WE HAVE A JUMPIF.  GET NEXT TOKEN
	JRST DOLINE		;UNREC SPEC CHR
	JUMPGE B,DOLJME		;MAKE SURE WE GOT A SYMBOL
	CAIE A,40		;MUST GET BRANCH CONDITION <SPACE>
	JRST DOLJME
	MOVSI C,-NBRCND
	MOVE T,TOKBUF
DOLJM1:	CAMN T,BRCND(C)
	JRST DOLJM2
DOLJM3:	AOBJN C,DOLJM1
	ERR [ASCIZ /UNKNOWN BRANCH CONDITION
/]
	JRST CPOPJ1


DOLJM2:	TRNN T,377
	TDZA TT,TT
	MOVE TT,TOKBUF+1
	CAME TT,BRCND1(C)
	JRST DOLJM3
	TRNN TT,377
	TDZA TT,TT
	MOVE TT,TOKBUF+2
	CAME TT,BRCND2(C)
	JRST DOLJM3
	PUSHJ P,SYMLOK		;LOOKUP VALUE OF BRANCH CONDITION
	 BRTYP
	JRST 4,.		;NOT FOUND IN SYMBOL TABLE???
	HRRZ B,(B)		;GET THE VALUE
	DPB B,BRCPNT		;THIS IS THE VALUE OF THE BRANCH CONDITION
	PUSHJ P,GETTOK		;NEXT TOKEN MUST BE BRANCH ADDRESS
	JRST DOLINE		;UNREC SPEC CHR
	MOVEM A,GOTCHR
	JUMPG B,DOLFX1		;JUMP IF GOT A NUMBER
	JUMPL B,DOLJM5		;JUMP IF GOT A SYMBOL
	ERR [ASCIZ /ILLEGAL BRANCH ADDRESS
/]
	JRST CPOPJ1

DOLJM5:	PUSHJ P,SYMLOK		;TRY TO FIND THE SYMBOL IN THE SYMBOL TABLE
	 0
	JRST DOLMFX		;NO THERE.
	HRRZ C,(B)		;FOUND IT.  GET THE VALUE
	LDB A,[POINT 9,(B),17]	;GET SYMBOL TYPE
	CAIN A,FIXTYP
	JRST DOLJFX		;ALREADY DEFINED AS FIXUP
	CAIE A,ADRTYP		;MUST BE A BRANCH ADDRESS TYPE SYMBOL
	JRST 4,.		;IT ISN'T???
	JRST DOLFX1

DOLMFX:	MOVSI A,FIXTYP		;MAKE A FIXUP TYPE SYMBOL POINTING AT THIS L
	PUSHJ P,ADDSYM		;ADD THIS SYMBOL TO THE SYMBOL TABLE
	MOVE B,SYMNXT
	SUBI B,2		;POINTER TO THE SYMBOL
DOLJFX:	HLLZ C,1(B)		;GET THE POINTER TO THE FIRST FIXUP
	GETFRE A
	HRLM A,1(B)
	HRRI C,(L)
	MOVEM C,(A)		;STORE →PREV FIXUP LIST,,C(L)
	MOVEI C,0		;STORE ZERO IN THE INSTRUCTION'S BRANCH ADDR FIELD
DOLFX1:	DPB C,BRAPNT		;STORE THE BRANCH ADDRESS IN THE INSTRUCTION
	PUSHJ P,GETTOK		;GET NEXT THING
	JRST DOLINE		;UNREC SPEC CHAR
	JUMPN B,DOLFX2
	CAIN A,"/"
	JRST DOSLAS
	CAIN A,";"
	JRST SKPEOL
	CAIN A,12
	JRST DMPLIN		;DUMP OUT LISTING BUFFER AND STORE BINARY
DOLFX2:	WARN [ASCIZ /GARBAGE AFTER VALID JUMPIF STATEMENT IGNORED
/]
	JRST SKPEOL

DOLIN1:	JUMPG B,DOLJME		;STATEMENT BEGINS WITH A NUMBER?
	CAIN A,";"
	JRST SKPEO1
	CAIN A,"<"		;IS IT THE BEGINNING OF A MASK STATEMENT
	JRST DOLMAS		;YES, GO DECODE IT.
	CAIN A,"/"
	JRST DOSLAS
	CAIN A,12
	JRST SDMPLI		;DUMP LISTING AND SKIP RETURN SINCE NO BINARY
	ERR [ASCIZ /UNKNOWN USE OF SPECIAL CHARACTER
/]
	JRST CPOPJ1


STRBIN:	CAIL L,400
	JRST STRBIE
	MOVE A,BINWRD
	MOVEM A,BINBUF(L)
	AOJA L,CPOPJ

STRBIE:	ERR [ASCIZ /LOCATION COUNTER OUT OF RANGE
/]
	EXIT
;DOLCOM, DOLEQU, DOLMSK

DOLDST:	MOVE A,TOKBUF		;GET FIRST WORD OF SYMBOL
	CAMN A,[ASCII /AR/]
	JRST [	TLO F,ARDST
		JRST CPOPJ1 	]
	CAMN A,[ASCII /BR/]
	JRST [	TLO F,BRDST
		JRST CPOPJ1	]
	PUSHJ P,SYMLOK		;SEE IF WE KNOW WHAT THE SYMBOL IS
	 DSTTYP
	JRST [	ERR [ASCIZ /UNDEFINED DESTINATION
/]
		POP P,(P)
		POPJ P,	]
	HRRZ B,(B)
	MOVEM B,SAVDST		;SAVE DESTINATION
	JRST CPOPJ1

DOLCOM:	PUSHJ P,DOLDST
	JRST CPOPJ1
	JRST DOLINL

DOLEQU:	PUSHJ P,DOLDST
	JRST CPOPJ1
	MOVEI A,1
	TLNE F,ARDST
	DPB A,ARDSTP
	TLNE F,BRDST
	DPB A,BRDSTP
	SKIPE A,SAVDST
	DPB A,DSTPNT
	PUSHJ P,EVAL
	JRST CPOPJ1
	PUSHJ P,GETTOK
	JRST CPOPJ1
	JUMPE B,DOLEQ1
	ERR [ASCIZ /EXTRA GARBAGE AFTER ALU STATEMENT
/]
	JRST CPOPJ1

DOLEQ1:	CAIN A,"/"
	JRST DOSLAS
	CAIN A,12
	JRST DMPLIN
	JRST SKPEOL

DOSLAS:	LDB A,OPPNT
	CAIN A,2
	JRST [	ERR [ASCIZ /CANNOT PERFORM SPEC OP WITH THIS OPCODE
/]
		JRST CPOPJ1	]
	PUSHJ P,GTCHR
	CAIN A,"="
	JRST DOSPEC
	CAIE A,12
	JRST DOSLAS
	TLO F,GOTONE
DOSLA1:	ERR [ASCIZ /MISSING SPEC STATEMENT
/]
	JRST CPOPJ1

DOSPEC:	PUSHJ P,RDNUM
	JUMPE D,DOSLA1
	CAILE B,14
	JRST [	ERR [ASCIZ /SPEC VALUE OUT OF RANGE
/]
		JRST CPOPJ1	]
	MOVE C,SPCTB1(B)
	DPB C,OPPNT
	MOVE C,SPCTB2(B)
	DPB C,SPCPNT
	JRST SKPEOL

DOLMAS:	PUSHJ P,DOLMSK
	JRST CPOPJ1
	JRST DOLINL


DOLMSK:	PUSHJ P,GETTOK
	POPJ P,			;UNREC SPEC CHR
	JUMPL B,DOLMS1		;JUMP IF WE GOT A SYMBOL
	ERR [ASCIZ /INVALID MASK SPECIFICATION
/]
	POPJ P,

DOLMS1:	PUSH P,A		;SAVE SEPARATOR
	PUSHJ P,SYMLOK		;LOOK UP THE SYMBOL
	 STYP
	JRST [	ERR [ASCIZ /UNDEFINED SOURCE SYMBOL
/]
		POP P,(P)
		POPJ P,	]
	HRRZ B,(B)		;GET VALUE
	DPB B,SPNT		;STORE S SELECT FIELD
	POP P,A			;GET BACK SEPARATOR
	CAIN A,"←"
	JRST DOLMS2		;SHIFT IS SPECIFIED
	CAIE A,">"
	CAIN A,","
	JRST DOLMS3		;NO SHIFT SPECIFIED
DOLMS4:	ERR [ASCIZ /ILLEGAL MASK SPECIFICATION FORMAT
/]
	POPJ P,

DOLMS3:	TDZA B,B
DOLMS2:	PUSHJ P,RDSNUM		;READ NUMBER IN B, SEPARATOR IN A (USE AS SHIFT)
	DPB B,ROTPNT
	CAIN A,">"
	JRST [	MOVEI D,=15	;MASK NOT SPECIFIED, USE 177777←0
		JRST DOLMS5	]
	CAIE A,","
	JRST DOLMS4
	PUSHJ P,RDNUM
	JUMPE D,[MOVEI D,=15	;MASK NOT SPECIFIED, USE 177777←0
		 JRST DOLMS5	]
	MOVEI C,1(B)
	AND C,B
	JUMPN C,[ERR [ASCIZ /MASK NOT RIGHT ADJUSTED STRING OF ONES
/]
		POPJ P,	]
	MOVEI C,1(B)
	JFFO C,.+1
	MOVN D,D
	MOVEI D,=35-1(D)	;NUMBER OF CONSECUTIVE ONES - 1
DOLMS5:	DPB D,MSKPNT
	CAIE A,","
	CAIN A,">"
	JRST [	MOVEI B,0	;SHIFT NOT SPECIFIED, USE 0
		JRST DOLMS6	]
	CAIE A,"←"
	JRST DOLMS4
	PUSHJ P,RDSNUM		;READ NUMBER IN B, SEPARATOR IN A
DOLMS6:	DPB B,MRTPNT
	CAIN A,">"
	JRST [	MOVEI B,0	;NO B SEL FIELD SPECIFIED, USE AR
		JRST DOLMS7	]
	CAIE A,","
	JRST DOLMS4
	PUSHJ P,GETTOK
	POPJ P,
	MOVE B,TOKBUF
	CAMN B,[ASCII /AR/]
	MOVEI B,0
	CAMN B,[ASCII /BR/]
	MOVEI B,1
	TLNN B,-1
	JRST DOLMS7
	ERR [ASCIZ /B SELECT FIELD NOT AR OR BR
/]
	POPJ P,

DOLMS7:	DPB B,BSLPNT
	CAIE A,">"
	JRST DOLMS4
	TLO F,GOTMSK
	JRST CPOPJ1

;OPCODE TABLE FOR SPEC FIELD
SPCTB1:	0		;SPEC 0
	1		;SPEC 1
	2		;SPEC 2
	3		;SPEC 3
	3		;SPEC 4
	4		;SPEC 5
	4		;SPEC 6
	5		;SPEC 7
	5		;SPEC 10
	6		;SPEC 11
	6		;SPEC 12
	7		;SPEC 13
	7		;SPEC 14

;SPEC 3 TABLE FOR SPEC FIELD
SPCTB2:	1		;SPEC 0
	1		;SPEC 1
	0		;SPEC 2
	0		;SPEC 3
	1		;SPEC 4
	0		;SPEC 5
	1		;SPEC 6
	0		;SPEC 7
	1		;SPEC 10
	0		;SPEC 11
	1		;SPEC 12
	0		;SPEC 13
	1		;SPEC 14
;EVAL

;EVALUATE ALU EXPRESSION

EVAL:	TDZ F,[GOTMSK,,PEVAR!PEVBR]
	SETZM OPWORD
	PUSHJ P,EVL
	POPJ P,
	TLO F,GOTONE
	JRST CPOPJ1

EVL:	PUSHJ P,EVLNXT		;GET NEXT ITEM AND SEPARATOR
	POPJ P,
	CAIN A,")"
	PUSHJ P,GTCHR
	TRNN F,EVNUM		;SKIP IF EVLREC IS RETURNING A NUMBER
	JRST EVAL1
	CAIN B,1
	JRST EVLNM1		;B OPERAND IS +1 OR -1
EVLNM2:	CAIE B,0
	CAIN B,177777
	JRST EVLNM
	ERR [ASCIZ /NUMBER WITHOUT ≡
/]
	POPJ P,

EVLNM:	MOVEI C,70		;M=H, -S3 -S2 -S1 -S0 = 1100, CN = L  (F=0000)
	CAIN B,177777
	MOVEI C,46		;M=H, -S3 -S2 -S1 -S0 = 0011, CN = L  (F=1111)
	DPB C,ALUPNT		;STORE ALU FIELD (M -S3 -S2 -S1 -S0 -CN)
	MOVE C,OPWORD
	TDNN C,[700000,,-1]
	JRST CPOPJ1
	ERR [ASCIZ /NUMBER MIXED WITH OPERATORS
/]
	POPJ P,

EVLNM1:	HRRZ C,OPWORD
	CAIE C,"+"
	CAIN C,"-"
	CAIA
	JRST EVLNM2
	MOVE D,OPWORD
	TLNE D,600000
	JRST EVLILG
	MOVEI D,37		;M=L, -S3 -S2 -S1 -S0 = 1111, CN = H (F=A+1)
	CAIE C,"+"
	MOVEI D,0		;M=L, -S3 -S2 -S1 -S0 = 0000, CN = L (F=A-1)
	DPB D,ALUPNT
	JRST CPOPJ1

EVLILG:	ERR [ASCIZ /IMPOSSIBLE ALU OPERATION
/]
	POPJ P,

EVAL1:	TRNN F,EVAR!EVBR!EVMASK	;DIDN'T GET A NUMBER, SKIP IF WE GOT AN ITEM
	JRST EVAL2		;DIDN'T GET ITEM, CHECK FOR UNARY OPERATOR OR PARENS
	PUSHJ P,BINOPT		;SKIP IF SEPARATOR IS A BINARY OPERATOR
	JRST EVAL1A		;SEPARATOR IS NOT A BINARY OPERATOR
	MOVE D,OPWORD
	TRNE D,-1		;SKIP IF THERE WAS NO PREVIOUS OPERATOR
	JRST EVAL1E		;TWO OPERATIONS - ERROR
	HRRM A,OPWORD		;STORE OPERATOR
	CAIE A,"+"
	CAIN A,"-"
	TLNN D,700000		;SKIP IF NEGATION IS SPECIFIED AT ALL
	JRST EVAL1Q		;NO NEGATION OR NOT ARITH OP
	ERR [ASCIZ /NEGATION CANNOT BE SPECIFIED IN AN ARITHMETIC OPERATION
/]
	POPJ P,

EVAL1E:	ERR [ASCIZ /TWO OPERATIONS IN ALU SPECIFICATION
/]
	POPJ P,

EVAL1Q:	TRNE F,EVMASK
	JRST EVL
	ERR [ASCIZ /B SELECT MUST COME SECOND IN ALU SPECIFICATION
/]
	POPJ P,

EVAL1A:	MOVE D,OPWORD
	TRNE D,-1
	JRST EVAL1B		;JUMP IF WE GOT SECOND ITEM
	MOVEI C,40		;M=H, -S3 -S2 -S1 -S0 = 0000, CN = 0 (F=A)
	TLNN F,GOTMSK
	MOVEI C,52		;M=H, -S3 -S2 -S1 -S0 = 0101, CN = 0 (F=B)
	TLNE D,700000		;SKIP IF NO COMPLEMENTING
	XORI C,36		;CHANGE F=A TO F=¬A AND F=B TO F=¬B
	DPB C,ALUPNT
	JRST CPOPJ1

EVAL1B:	HRRZ E,OPWORD		;GET OPERATION
	LDB D,[POINT 3,OPWORD,2]	;GET BITS
	MOVEI C,0		;COMPILE ALU FIELD INTO C
	CAIN E,"+"
	MOVEI C,14		;M=L, -S3 -S2 -S1 -S0 = 0110, CN = L (F=A+B)
	CAIN E,"-"
	MOVEI C,23		;M=L, -S3 -S2 -S1 -S0 = 1001, CN = H (F=A-B)
	CAIN E,"∨"
	MOVE C,ORTAB(D)
	CAIN E,"∧"
	MOVE C,ANDTAB(D)
	CAIN E,"⊗"
	MOVE C,XORTAB(D)
	DPB C,ALUPNT
	JRST CPOPJ1


EVAL2:	CAIN A,"¬"
	JRST EVLNT
	CAIN A,"("
	JRST EVLLP
	CAIN A,"≡"
	JRST EVLCON
	MOVE C,OPWORD
	TRNE C,-1
	JRST EVAL1B
	ERR [ASCIZ /ILLEGAL ALU EXPRESSION
/]
	POPJ P,

EVLNT:	PUSHJ P,GTCHR
	TLO F,GOTONE
	MOVEI B,0
	CAIN A,"("
	JRST [	TLZ F,GOTONE
		MOVSI B,400000		;RESULT INVERTED
		JRST EVLNT2	]
	CAIN A,"<"
	MOVSI B,200000		;A OPERAND INVERTED
	CAIE A,"A"
	CAIN A,"B"
	MOVSI B,100000		;B OPERAND INVERTED
	JUMPE B,EVLNT1
EVLNT2:	IORM B,OPWORD		;INDICATE APPROPRIATE INVERSION
	JRST EVL

EVLNT1:	ERR [ASCIZ /INVALID USE OF ¬
/]
	POPJ P,

EVLLP:	MOVE E,OPWORD
	TLNE E,400000
	JRST EVL
	ERR [ASCIZ /INVALID USE OF PARENTHESES
/]
	POPJ P,

EVLCON:	PUSHJ P,RDNUM
	JUMPN D,EVLCO1
	TLO F,GOTONE		;PUT THAT CHAR BACK FOR GETTOK
	PUSHJ P,GETTOK
	JRST EVLCER
	PUSH P,A
	PUSHJ P,SYMLOK		;LOOK UP SYMBOL, FOR CONTYPS ONLY
	 CONTYP
	JRST EVLCR1		;NOT FOUND
	POP P,A
	HRRZ B,(B)		;GET VALUE
	JRST EVLCO1

EVLCER:	ERR [ASCIZ /UNRECOGNIZED ≡ SPECIFICATION
/]
	POPJ P,

EVLCR1:	POP P,A
	ERR [ASCIZ /SYMBOL FOLLOWING ≡ MUST BE CONSTANT SYMBOL
/]
	POPJ P,

EVLCO1:	SKIPN OPWORD
	JRST EVLCO2
	ERR [ASCIZ /INVALID USE OF ≡ EXPRESSION
/]
	POPJ P,

EVLCO2:	XORI B,177777		;STORE COMPLEMENT OF CONSTANT
	DPB B,CONPNT
	MOVEI C,2
	DPB C,OPPNT		;SET OP CODE TO 2 INDICATING CONSTANT
	IOR F,[GOTMSK,,EVMASK]	;THIS IS LOGICALLY A MASK FIELD
	JRST EVAL1


;GET NEXT ITEM AND SEPARATOR.  AN ITEM IS EITHER A NUMBER, THE STRING
;AR, THE STRING BR OR A MASK SPECIFICATION.  FLAGS ARE SET IN THE
;RIGHT HALF OF F TO INDICATE WHAT HAS BEEN RETURNED.  EVNUM INDICATES
;A NUMBER, EVAR AND EVBR INDICATE THE STRINGS AR AND BR RESPECTIVELY.
;EVMASK INDICATES A MASK SPECIFICATION WAS SCANNED.  THE FLAGS PEVAR
;AND PEVBR ARE ALSO SET IN THE RIGHT HALF OF F IF THE STRING AR OR BR
;IS SCANNED.  THE DIFFERENCE BETWEEN THESE AND EVAR AND EVBR IS THAT
;THE LATTER TWO AND EVNUM AND EVMASK ARE CLEARED UPON ENTERING EVLNXT.
;EVLNXT ALSO SETS VARIOUS FIELDS IN BINWRD SUCH AS ALUPNT AND BSLPNT.
;THE SEPARATOR IS RETURNED IN A.  IF EVLNXT SCANS A NUMBER, THE VALUE
;IS RETURNED IN B.

EVLNXT:	TRZ F,EVNUM!EVMASK!EVAR!EVBR
	PUSHJ P,GETTOK
	POPJ P,
	JUMPL B,EVL1		;JUMP IF SYMBOL IS SPECIFIED
	JUMPE B,EVL2		;ONLY GOT A SEPARATOR
	HRRZ B,B		;GET NUMBER
	IORI F,EVNUM
	JRST CPOPJ1

EVL1:	MOVE B,TOKBUF
	CAMN B,[ASCII /AR/]
	IORI F,EVAR
	CAMN B,[ASCII /BR/]
	IORI F,EVBR
	TRNE F,EVAR!EVBR
	JRST EVL1A
	ERR [ASCIZ /UNKNOWN B FIELD SELECT
/]
	POPJ P,

EVL1A:	TRNE F,PEVAR!PEVBR
	JRST [	ERR [ASCIZ /MULTIPLE B SELECT SPECIFIED
/]
		POPJ P,	]
	TRNE F,EVAR
	IORI F,PEVAR
	TRNE F,EVBR
	IORI F,PEVBR
	TLNN F,GOTMSK
	JRST EVL1B		;MASK NOT YET SPECIFIED
	LDB C,BSLPNT		;GET B SELECT FIELD FROM MASK
	LDB D,OPPNT
	CAIN D,2
	JRST EVL1B		;IF A CONSTANT WAS SPECIFIED ANY B SELECT IS OK
	JUMPN C,EVL1C		;WAS BR
	TRNE F,EVAR
	JRST CPOPJ1		;RETURN INDICATING EVAR OR EVBR
EVL1E:	ERR [ASCIZ /INCONSISTENT B SELECT FIELDS
/]
	POPJ P,

EVL1C:	TRNN F,EVBR
	JRST EVL1E
	JRST CPOPJ1		;RETURN INDICATING EVAR OR EVBR

EVL1B:	MOVEI C,0
	TRNN F,EVAR
	MOVEI C,1
	DPB C,BSLPNT		;STORE B SELECT FIELD
	JRST CPOPJ1		;RETURN INDICATING EVAR OR EVBR

EVL2:	CAIE A,"<"
	JRST CPOPJ1		;LET LEVEL ABOVE FIGURE OUT OPERATORS
	TLNE F,GOTMSK
	JRST [	ERR [ASCIZ /MULTIPLE MASK SPECIFICATION
/]
		POPJ P,	]
	PUSHJ P,DOLMSK		;TRY TO PARSE MASK SPECIFICATION
	POPJ P,
	PUSHJ P,GETTOK
	POPJ P,
	JUMPE B,EVLMS1
	ERR [ASCIZ /ILLEGAL FORMAT
/]
	POPJ P,

EVLMS1:	IORI F,EVMASK
	TRNN F,PEVAR!PEVBR
	JRST CPOPJ1
	LDB C,BSLPNT		;GET THE B SEL SPECIFIED BY THE MASK
	TRNE F,PEVAR
	JUMPE C,CPOPJ1		;IF PEVAR IS SET B SEL BETTER BE ZERO (AR)
	TRNE F,PEVBR
	JUMPN C,CPOPJ1
	ERR [ASCIZ /INCONSISTENT B SELECT FIELD
/]
	POPJ P,



BINOPT:	CAIE A,"∧"
	CAIN A,"∨"
	JRST CPOPJ1
	CAIE A,"⊗"
	CAIN A,"+"
	JRST CPOPJ1
	CAIN A,"-"
	JRST CPOPJ1
	POPJ P,

DEFINE LOGIC(S)<1⊗5+<17≠S>⊗1>

ORTAB:	LOGIC(16)
	LOGIC(15)
	LOGIC(10)
	LOGIC(4)
	LOGIC(1)
	LOGIC(2)
	LOGIC(7)
	LOGIC(13)

ANDTAB:	LOGIC(13)
	LOGIC(7)
	LOGIC(2)
	LOGIC(1)
	LOGIC(4)
	LOGIC(10)
	LOGIC(15)
	LOGIC(16)

XORTAB:	LOGIC(6)
	LOGIC(11)
	LOGIC(11)
	LOGIC(6)
	LOGIC(11)
	LOGIC(6)
	LOGIC(6)
	LOGIC(11)
;GETTOK, GTCHR

GETTOK:	MOVEI B,0
GETTK1:	PUSHJ P,GTCHR
	CAIE A,11
	CAIN A,40
	JRST GETTK1
	CAIL A,"A"
	CAILE A,"Z"
	CAIA
	JRST TOKLET
	CAIN A,"~"
	JRST TOKLET
	CAIL A,"0"
	CAILE A,"9"
	CAIA
	JRST TOKNUM
	CAIN A,15
	JRST GETTK1
	CAIN A,12
	JRST CPOPJ1
	CAIE A,"-"
	CAIN A,"¬"
	JRST CPOPJ1		;ALU OPERATORS
	CAIE A,"∨"
	CAIN A,"∧"
	JRST CPOPJ1		;ALU OPERATORS
	CAIE A,"<"
	CAIN A,">"
	JRST CPOPJ1		;RETURN WITH MASK SPEC DELIMITERS
	CAIE A,"←"
	CAIN A,","
	JRST CPOPJ1		;RETURN WITH MASK FIED SEPARATORS
	CAIE A,"/"
	CAIN A,"="
	JRST CPOPJ1		;MORE VALID SEPARATORS
	CAIE A,";"
	CAIN A,":"
	JRST CPOPJ1
	CAIE A,"+"
	CAIN A,"≡"
	JRST CPOPJ1
	CAIE A,")"
	CAIN A,"("
	JRST CPOPJ1
	ERR [ASCIZ /UNRECOGNIZED SPECIAL CHARACTER
/]
	POPJ P,

TOKLET:	MOVE C,[TOKBUF,,TOKBUF+1]
	SETZM TOKBUF
	BLT C,TOKBUF+17
	MOVE C,[440700,,TOKBUF]
	MOVE B,C
TOKLE1:	IDPB A,C
	PUSHJ P,GTCHR
	CAIL A,"A"
	CAILE A,"Z"
	CAIA
	JRST TOKLE1
	CAIL A,"0"
	CAILE A,"9"
	CAIA
	JRST TOKLE1
	CAIE A,"["
	CAIN A,"]"
	JRST TOKLE1
	CAIE A,"_"
	JRST CPOPJ1
	JRST TOKLE1

TOKNUM:	TDZA C,C
TOKNU1:	PUSHJ P,GTCHR
	CAIL A,"0"
	CAILE A,"9"
	JRST TOKNU2
	LSH B,3
	ADDI B,-"0"(A)
	IMULI C,12
	ADDI C,-"0"(A)
	JRST TOKNU1

TOKNU2:	CAIE A,"."
	JRST TOKNU3
	MOVE B,C
	PUSHJ P,GTCHR
TOKNU4:	TLO B,1
	JRST CPOPJ1

TOKNU3:	MOVE C,B
	JRST TOKNU4


GTCHR2:	PUSHJ P,LSTOUT
	AOS PAGE
	MOVEI A,1
	MOVEM A,LINE
GTCHR:	TLZE F,GOTONE
	POPJ P,
	MOVEI A,0
	EXCH A,GOTCHR
	JUMPN A,CPOPJ
	SOSG SRCHDR+2
	IN SRC,
	JRST GTCHR1
	OUTSTR [ASCIZ /END OF FILE AND NO END STATEMENT
/]
	EXIT

GTCHR1:	ILDB A,SRCHDR+1
	JUMPE A,GTCHR
	CAIN A,14
	JRST GTCHR2
	IDPB A,LINPNT
	CAIL A,"a"
	CAILE A,"z"
	CAIA
	SUBI A,40
	POPJ P,
;PSEUTB, PSEUT2, PSEUDT, ACOMNT, ALOC, AEND, ADEBUG, RDNUM, RDSNUM, SKPEOL, ASET

PSEUTB:	ASCII /COMME/
	ASCII /LOC/
	ASCII /END/
	ASCII /DEBUG/
	ASCII /SET/
NPSEUD←←.-PSEUTB

PSEUT2:	ASCII /NT/
	0
	0
	0
	0

PSEUDT:	ACOMNT
	ALOC
	AEND
	ADEBUG
	ASET

ACOMN1:	PUSHJ P,GTCHR
ACOMNT:	CAIE A,40
	CAIN A,11
	JRST ACOMN1
	MOVE B,A		;THIS IS THE DELIMITER
ACOMN2:	PUSHJ P,GTCHR
	CAIN A,(B)		;IS IT THE DELIMITER
	JRST SKPEO1		;YES
	CAIE A,12
	JRST ACOMN2
	PUSHJ P,SDMPLI
	JFCL
	JRST ACOMN2

ALOC:	PUSHJ P,RDNUM
	JUMPN D,ALOC1
	ERR [ASCIZ /NON-NUMERIC OR MISSING ARGUMENT TO LOC
/]
	JRST CPOPJ1

ALOC1:	CAIL B,400
	JRST [	ERR [ASCIZ /LOC OUT OF RANGE
/]
		JRST CPOPJ1	]
	MOVE L,B
	JRST SKPEO1

ASET:	PUSHJ P,GETTOK
	JRST ASETER
	CAIE A,"="
	JRST ASETER
	JUMPGE B,ASETER		;JUMP IF WE DIDN'T GET A SYMBOL
	PUSHJ P,RDNUM
	JUMPE D,ASETER		;JUMP IF DIDN'T GET MUCH OF A NUMBER
	HRLI B,CONTYP
	PUSH P,B		;SAVE VALUE
	PUSHJ P,SYMLOK		;SEE IF THE SYMBOL IS ALREADY DEFINED
	 0
	JRST ASET1		;NOT FOUND.  MAKE A NEW SYMBOL
	LDB A,[POINT 9,(B),17]	;GET SYMBOL TYPE
	CAIE A,CONTYP
	JRST ASET2
	WARN [ASCIZ /CONSTANT SYMBOL BEING REDEFINED
/]
	POP P,(B)		;STORE NEW VALUE
	JRST SKPEO1

ASET1:	POP P,A
	PUSHJ P,ADDSYM		;ADD CONSTANT TYPE SYMBOL
	JRST SKPEO1

ASET2:	ERR [ASCIZ /ALREADY A SYMBOL WITH THAT NAME
/]
	JRST CPOPJ1

ASETER:	ERR [ASCIZ /UNRECOGNIZED SET STATEMENT
/]
	JRST CPOPJ1

AEND:	TLO F,ENDASM
ADEBUG:	JRST SKPEO1

;RETURN NUMBER IN B, ASSUMED OCTAL UNLES FOLLOWED BY A DECIMAL POINT.
;D GETS THE NUMBER OF DIGITS FOUND.
RDNUM:	SETZB B,C
	MOVEI D,0
RDNUM1:	PUSHJ P,GTCHR
	CAIE A,40
	CAIN A,11
	JRST RDNUM1
	CAIL A,"0"
	CAILE A,"9"
	JRST RDNUM2
	IMULI C,12
	ADDI C,-"0"(A)
	LSH B,3
	ADDI B,-"0"(A)
	AOJA D,RDNUM1

RDNUM2:	CAIE A,"."
	POPJ P,
	MOVE B,C
	JRST GTCHR

RDSNUM:	PUSHJ P,GTCHR
	CAIN A,"-"
	JRST RDSNU1
	TLO F,GOTONE
	JRST RDNUM

RDSNU1:	PUSHJ P,RDNUM
	JUMPE D,CPOPJ
	MOVN B,B
	ADDI B,=16
	POPJ P,

SKPEOL:	PUSHJ P,GTCHR
	CAIE A,12
	JRST SKPEOL
	JRST DMPLIN

SKPEO1:	PUSHJ P,GTCHR
	CAIE A,12
	JRST SKPEO1
	JRST SDMPLI
;BRCND, BRCND1, BRCND2

BRCND:	ASCII /MEM_D/
	ASCII /~MEM_/
	ASCII /MIOBC/
	ASCII /RESET/
	ASCII /MASKI/
	ASCII /~MASK/
	ASCII /~MASK/
	ASCII /MASK[/
	ASCII /MICRO/
	ASCII /TRUE/
	ASCII /MICRQ/
NBRCND←←.-BRCND

BRCND1:	ASCII /ONE/
	ASCII /DONE/
	ASCII /_BUSY/
	ASCII /_COND/
	ASCII /S0/
	ASCII /IS0/
	ASCII /[0]/
	ASCII /0]/
	ASCII /_RPE/
	0
	ASCII /_RQ_S/

BRCND2:	0
	0
	0
	0
	0
	0
	0
	0
	0
	0
	ASCII /YNC/
;SYMBOL TABLE FORMAT, PRSYMS, PSEUTB

COMMENT ⊗

VALUE TYPE,,VALUE
POINTER TO LIST OF FIXUPS ,, POINTER TO ASCIZ SYMBOL NAME

ABOVE REPEATED FOR EACH SYMBOL
⊗

DEFINE PRESYM (SYM,TYPE,VAL) <
	TYPE,,VAL
	[ASCIZ \SYM\]
>

PRSYMS:
PRESYM (<~SEL_BUS_REG>,DSTTYP,1)
PRESYM (<MA_HI>,DSTTYP,2)
PRESYM (<MA_LO>,DSTTYP,3)
PRESYM (<VBIT>,DSTTYP,4)
PRESYM (<ABIT>,DSTTYP,5)
PRESYM (<MAPRAM>,DSTTYP,6)
PRESYM (<~PTPNT>,DSTTYP,7)
PRESYM (<MAP_ENB>,DSTTYP,10)
PRESYM (<AR>,STYP,0)
PRESYM (<BR>,STYP,1)
PRESYM (<PADR_MICRO>,STYP,2)
PRESYM (<MICRQ_SEL>,STYP,2)
PRESYM (<MS[0_3]>,STYP,2)
PRESYM (<MS[4_19]>,STYP,3)
PRESYM (<MS[20_35]>,STYP,4)
PRESYM (<~VBIT_NEW_BIT>,STYP,5)
PRESYM (<~VBIT>,STYP,6)
PRESYM (<PTPNT>,STYP,7)
PRESYM (<MEM_DONE>,BRTYP,0)
PRESYM (<~MEM_DONE>,BRTYP,1)
PRESYM (<MIOBC_BUSY>,BRTYP,2)
PRESYM (<RESET_COND>,BRTYP,4)
PRESYM (<MASKIS0>,BRTYP,6)
PRESYM (<~MASKIS0>,BRTYP,7)
PRESYM (<~MASK[0]>,BRTYP,10)
PRESYM (<MASK[0]>,BRTYP,11)
PRESYM (<MICRO_RPE>,BRTYP,12)
PRESYM (<TRUE>,BRTYP,14)
PRESYM (<MICRQ_RQ_SYNC>,BRTYP,15)
LPRSYM←←.-PRSYMS
;CONSTANTS, VARIABLES AND TABLES

PDL:	BLOCK 100
SRCHDR:	BLOCK 3
SRCFIL:	SIXBIT /MPX/
	SIXBIT /MIC/
	0
	SIXBIT /MPXJBR/

LSTHDR:	BLOCK 3
LSTFIL:	SIXBIT /MPX/
	SIXBIT /LST/
	0
	SIXBIT /MPXJBR/

BINFIL:	SIXBIT /MPX/
	SIXBIT /BIN/
	0
	SIXBIT /MPXJBR/

ROMHDR:	BLOCK 3
ROMFIL:	SIXBIT /MPX/
	SIXBIT /ROM/
	0
	SIXBIT /MPXJBR/

INSHDR:	BLOCK 3
INSFIL:	SIXBIT /MPX/
	SIXBIT /INS/
	0
	SIXBIT /MPXJBR/

BINBUF:	BLOCK 400		;ASSEMBLE THE MICROCODE HERE
BINWRD:	0
LINBUF:	BLOCK 100		;BUFFER FOR ONE LINE OF TEXT
LINPNT:	440700,,LINBUF
SYMPNT:	0			;ADDRESS OF SYMBOL TABLE (AT TOP OF CORE)
SYMNXT:	0			;POINTER TO 1 + LAST SYMBOL STORED
NXTFRE:	0			;POINTER TO NEXT FREE STORAGE LOCATION
TOKBUF:	BLOCK 20
GOTCHR:	0
UNSYMS:	0			;FLAG SET IF ANY UNDEFINED SYMBOLS
SAVDST:	0			;DESTINATION SAVED HERE ON COMMA
PAGE:	0
LINE:	0
UUOACS:	BLOCK 20

OPPNT:	POINT 3,BINWRD,6	;BYTE POINTER TO OPCODE FIELD
BRCPNT:	POINT 4,BINWRD,26	;BYTE POINTER TO BRANCH CONDITION FIELD
BRAPNT:	POINT 8,BINWRD,34	;BYTE POINTER TO BRANCH ADDRESS FIELD
FIXPNT:	POINT 8,BINBUF(B),34	;BYTE POINTER TO BRANCH ADDRESS FIELD
ARDSTP:	POINT 1,BINWRD,33	;BYTE POINTER TO AR LOAD FIELD
BRDSTP:	POINT 1,BINWRD,34	;BYTE POINTER TO BR LOAD FIELD
DSTPNT:	POINT 4,BINWRD,32	;BYTE POINTER TO DESTINATION FIELD
SPNT:	POINT 3,BINWRD,10	;BYTE POINTER TO S SELECT FIELD
ROTPNT:	POINT 4,BINWRD,22	;BYTE POINTER TO ROT FIELD
MSKPNT:	POINT 4,BINWRD,14	;BYTE POINTER TO MASK SIZE FIELD
MRTPNT:	POINT 4,BINWRD,18	;BYTE POINTER TO MASK ROTATE FIELD
BSLPNT:	POINT 1,BINWRD,35	;BYTE POINTER TO B SEL FIELD
ALUPNT:	POINT 6,BINWRD,28	;BYTE POINTER TO ALU M, -S3 -S2 -S1 -S0, CN FIELD
SPCPNT:	POINT 1,BINWRD,7	;BYTE POINTER TO SPEC 3 FIELD
CONPNT:	POINT 16,BINWRD,22	;BYTE POINTER TO CONSTANT FIELD
MPNT:	POINT 1,BINWRD,23	;BYTE POINTER TO ALU M FIELD
S3PNT:	POINT 1,BINWRD,24	;BYTE POINTER TO ALU -S3 FIELD
S2PNT:	POINT 1,BINWRD,25	;BYTE POINTER TO ALU -S2 FIELD
S1PNT:	POINT 1,BINWRD,26	;BYTE POINTER TO ALU -S1 FIELD
S0PNT:	POINT 1,BINWRD,27	;BYTE POINTER TO ALU -S0 FIELD
CNPNT:	POINT 1,BINWRD,28	;BYTE POINTER TO ALU CN FIELD

OPWORD:	0			;RIGHT HALF IS INTERNAL ALU OP CODE
				;LEFT HALF IS BITS AS FOLLOWS:
				;400000    COMPLEMENT RESULT
				;200000    COMPLEMENT A OPERAND
				;100000    COMPLEMENT B OPERAND

MAC1:	ASCIZ /$M+1;774000017776
/

PATCH:	BLOCK 40

END	GO